package sim_moteur.factory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import sim_moteur.element.vegetal.Vegetal;

public class VegetauxFactory extends AbstractFactory implements
		ChoseFactoryI<Vegetal> {

	public final static String VEGETAL_NAME = "Vegetal_";
	public final static float POURCENTAGE_DEGENERATION_SPONTANEE = 0.03f; // 3%
	public final static String SUFFIX_VITALITE = ".initial.vie";

	private int compteur = 0;

	// private static ThreadLocal<VegetauxFactory> instance = new
	// ThreadLocal<>();

	public VegetauxFactory(String simPrefix) {
		super(simPrefix);
		nombre = nombreVegetauxMax;
	}

	/**
	 * Retourne la seule instance de fabrique de vegetaux. (singleton) Noter que
	 * chaque thread possède sa propre copie du singleton
	 * 
	 * @return la fabrique
	 */
	// public static VegetauxFactory getInstance(String simPrefix) {
	// if (instance.get() == null) {
	// instance.set( new VegetauxFactory(simPrefix));
	// }
	// return instance.get();
	// }

	@Override
	public Vegetal get() {
		String nom = VEGETAL_NAME + (compteur++);
		float vitalite = properties.getFloatProperty(nom + SUFFIX_VITALITE);
		if (vitalite < 0)
			vitalite = 1;

		Vegetal vegetal = new Vegetal(nom, vitalite, getPrefix());
		place(vegetal);

		// On cherche les propriétés concernant l'objet fabriqué
		List<String> propList = properties.tourveProprietesQuiCommencePar(nom);
		if (propList.contains(nom + "initial.vie")) {
			vegetal.setVie(properties.getFloatProperty(nom + "initial.vie"));
		}
		nombre--;
		return vegetal;
	}

	/**
	 * Retourne une plante sans la place sur le terrain, sans lire les
	 * propriétés et sans décrémenter le nombre de plante total dans la factory
	 * . C'est une plante qui est apparue en cours de simulation
	 * 
	 * @return Une plnate non placée
	 */
	public Vegetal getSimple() {
		String nom = VEGETAL_NAME + (compteur++);

		Vegetal vegetal = new Vegetal(nom, 1, getPrefix());

		return vegetal;
	}

	/**
	 * Réinitialise la fabrique
	 */
	// public static void reset() {
	// String prefix = instance.get().getPrefix();
	// instance.set(new VegetauxFactory(prefix));
	// }

	@Override
	public Map<String, Vegetal> getAll() {
		Map<String, Vegetal> retMap = new HashMap<>();
		while (nombre > 0) {
			Vegetal nouveauVegetal = get();
			retMap.put(nouveauVegetal.getName(), nouveauVegetal);
		}
		return retMap;
	}

}
